package home;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.criterion.Restrictions;

import modelo.Asiento;
import modelo.Usuario;
import modelo.tp2.Tramo;
import modelo.tp2.Vuelo;
import modelo.tp3.Criterio;
import modelo.tp3.CriterioDeOrden;
import DAO.GenericDao;
import persistencia.CreadorSesiones;

public class HomePersistenciaHibernate {


	@SuppressWarnings("unchecked")
	public List<Asiento> asientosDisponiblesDe(Tramo tramo) {
		return CreadorSesiones.getSession().createQuery(
			    "select asiento from Tramo as tramo inner join tramo.asientos as asiento "
			    + "where asiento.usuario is null and tramo.idTramo = :idDelTramo")
			    .setInteger("idDelTramo", tramo.getIdTramo())
			    .list();
	}
	
	@SuppressWarnings("unchecked")
	public List<Asiento> asientosDeUsuario(Usuario usuario) {
		return CreadorSesiones.getSession().createQuery(
			    "select asiento from Tramo as tramo inner join tramo.asientos as asiento "
			    + "where asiento.usuario= :user")
			    .setString("user", usuario.getNombre_usuario())
			    .list();
	}
	
	@SuppressWarnings("unchecked")
	public List<Usuario> obtenerUsuarioCon(String nombre_usuario) {
		return CreadorSesiones.getSession().createQuery(
			    "select usuario from Sistema as sistema inner join sistema.listaUsuarios as usuario "
			    + "where usuario.nombre_usuario= :user")
			    .setString("user", nombre_usuario)
			    .list();
	}
	
	public void asignarAsientosDeA(Usuario usuario, List<Asiento> asientosDisponibles, int cantAsientos){
		GenericDao<Asiento> DAO = new GenericDao<Asiento>(Asiento.class);
		int counter=cantAsientos;
		for(Asiento a : asientosDisponibles){
			if(  counter > 0){
				a.setUsuario(usuario);
				counter --;
			}
		}
		DAO.saveAll(asientosDisponibles);
	}
	
	@SuppressWarnings("unchecked")
	public List<Vuelo> ejecutarConsultaSegun(Criterio criterio, String orden){
		
		//joins?
//		 Criteria c = CreadorSesiones.getSession().createCriteria(Vuelo.class);
//		 c.add(Restrictions.eq("nombre", "guido"));
		
		 return CreadorSesiones.getSession().createQuery(
				 
				 
			    "select vuelo from Aerolinea as aerolinea inner join "
			    + "aerolinea.vuelos as vuelo inner join "
			    + "vuelo.tramos as tramo "
			    + "where "+ criterio.armarCriterio() + " " +orden)
  		       .list();
				 
//				 "select vuelos from Aerolinea as aerolinea inner join " 
//				 + "aerolinea.vuelos as vuelo inner join " 
//				 + "vuelo.tramos as tramo inner join "
//				 + "tramo.asientos as asiento inner join "
//				 + "asiento.usuario" +
//				  " where "+ criterio.armarCriterio() + " " + orden.getOrdenadoPor())
//				    .list();
				 
//				 "select vuelos from Aerolinea as aerolinea" +
//				  " where "+ criterio.armarCriterio() + " " + orden.getOrdenadoPor())
//				    .list();
	}
}